#pragma once
#include <cctype>
#include <cstdio>
#include <iostream>
#include <cstddef>
#include <fstream>
#include <unordered_map>
#include <string>
#include <vector>
#include <sys/stat.h>

namespace muduo{
    extern std::unordered_map<int,std::string> _statu_msg;
    extern std::unordered_map<std::string,std::string> _mime_msg ;
    class Util{
    public:
        static size_t Split(const std::string& src,const std::string sep,std::vector<std::string>* array);
        // 读取文件的所有内容，放到一个string中
        static bool ReadFile(const std::string& filename,std::string* buffer);
        // 向文件中写入数据
        static bool WriteFile(const std::string& filename,const std::string& buffer);
        // URL编码：避免url中的特殊字符与被查询字符串的特殊字符与http请求特殊字符产生歧义
        // 把url中可能引发歧义的字符串转化为一种特殊的格式，确保这些字符在url中被安全的传递
        // 编码格式，将特殊字符的ascii码值，转换为两个16进制字符，前缀加%号，：C++ -> C%2B%2B
        // 不编码的特殊字符，RFC3986文档规定 . _ - ~，字母、数字属于绝对不编码字符
        // RFC3986文档规定,编码格式为%HH,就是%后加两个大写16进制字符
        // W3C标准中规定，查询字符串中的空格，需要编码为+， 解码则是+转空格
        static std::string UrlEncode(const std::string& url,bool convert_space_to_plus);
        static char HEXTOI(char c);
        // URL解码: 将编码后的url编码解码为原来的字符串
        static std::string UrlDecode(const std::string& urlencode,bool convert_plus_to_space);
        // 响应状态码的描述信息
        static std::string StatuDesc(int status);
        // 根据文件名后缀获取mime
        static std::string Getmime(const std::string& filename);
        // 判断文件是否是一个目录
        static bool IsDirectory(const std::string& filename);
        // 判断一个文件是否是一个普通文件
        static bool IsRegular(const std::string& filename);
        // 判断访问路径的合法性
        // /../name不合法 只有在访问服务器根目录下的文件才合法
        static bool ValidPath(const std::string& path);
    };
}